package br.com.saab.quantotempofalta.negocio;

import java.util.Date;

import org.springframework.stereotype.Component;

import br.com.saab.quantotempofalta.utils.DataUtils;

/**
 * Classe responsável por calcular a quantidade de horas trabalhadas.
 * 
 * @author Felipe
 */
@Component
public class CalculadorHorasTrabalhadas {

	private String horaEntrada1;
	private String horaSaida1;
	private String horaEntrada2;
	private String horaSaida2;

	private Date entrada1;
	private Date saida1;
	private Date entrada2;
	private Date saida2;

	/**
	 * <p>
	 * Recupera uma string formatada (HH:mm:ss) contendo a quantidade de horas
	 * trabalhadas de acordo com as entradas e saídas informadas.
	 * </p>
	 * 
	 * @return <ul>
	 *         <li>Se entrada1 e saida1 foram informadas então retorna a
	 *         intervalo entre elas</li>
	 *         <li>Se entrada2 e saida2 foram informadas então retorna a
	 *         intervalo entre elas</li>
	 *         <li>Se entrada1, saida1 e entrada2 foram informadas então retorna
	 *         a soma do primeiro período com o intervalo entre a entrada2 até a
	 *         data atual</li>
	 *         <li>Se entrada1, saída1, entrada2 e saída2 foram informadas então
	 *         retorna a soma os dois intervalos</li>
	 *         <li>Para qualquer outro caso retona uma String vazia</li>
	 *         </ul>
	 */
	public String getHorasTrabalhadas() {

		// primeiro período
		Date periodo1 = null;
		if (entrada1 != null && saida1 != null) {
			periodo1 = calculaIntervaloPeriodo(entrada1, saida1);
		}

		// segundo período
		Date periodo2 = null;
		if (entrada2 != null) {
			if (saida2 != null)
				periodo2 = calculaIntervaloPeriodo(entrada2, saida2);
			else
				periodo2 = calculaIntervaloPeriodo(entrada2, new Date());
		}

		// horas trabalhadas
		if (periodo1 != null) {
			if (periodo2 != null)
				return DataUtils.formataTempo(new Date(periodo1.getTime() + periodo2.getTime()));
			else
				return DataUtils.formataTempo(periodo1);
		}

		// não tem dados suficientes pra calcular
		return "";
	}
	
	/**
	 * Calcula o intervalo de tempo entre duas datas.
	 */
	private Date calculaIntervaloPeriodo(Date entrada, Date saida) {
		return new Date(saida.getTime() - entrada.getTime());
	}
	
	public void setHoraEntrada1(String horaEntrada1) {
		if (this.horaEntrada1 != horaEntrada1) {
			this.horaEntrada1 = horaEntrada1;
			entrada1 = formataHoraEmData(horaEntrada1);
		}
	}

	public void setHoraSaida1(String horaSaida1) {
		if (this.horaSaida1 != horaSaida1) {
			this.horaSaida1 = horaSaida1;
			saida1 = formataHoraEmData(horaSaida1);
		}
	}

	public void setHoraEntrada2(String horaEntrada2) {
		if (this.horaEntrada2 != horaEntrada2) {
			this.horaEntrada2 = horaEntrada2;
			entrada2 = formataHoraEmData(horaEntrada2);
		}
	}

	public void setHoraSaida2(String horaSaida2) {
		if (this.horaSaida2 != horaSaida2) {
			this.horaSaida2 = horaSaida2;
			saida2 = formataHoraEmData(horaSaida2);
		}
	}
	
	private Date formataHoraEmData(String hora) {
		try {
			return DataUtils.adicionaDataEmHora(hora);
		} catch (Exception e) {
			return null;
		}
	}

}
